/*
 * file.c
 *
 *  Created on: 2017年3月21日
 *      Author: zhikang.peng
 */

#include "file.h"

void file_readfat(int *fat, unsigned char *img) {
	int i, j = 0;
	for (i = 0; i < 2880; i += 2) {
		fat[i + 0] = (img[j + 0] | img[j + 1] << 8) & 0xfff;
		fat[i + 1] = (img[j + 1] >> 4 | img[j + 2] << 4) & 0xfff;
		 j += 3;
	}
}

/**
 * 文件加载
 * clustno 簇号
 * size 文件大小
 * buf 文件内容缓存区
 * fat
 * img 磁盘映像
 */
void file_load(int clustno, int size, char *buf, int *fat, char *img) {
	int i;
	for (;;) {
		if (size <= 512) {
			for (i = 0; i < size; i++) {
				buf[i] = img[clustno * 512 + i];
			}
			break;
		}

		for (i = 0; i < 512; ++i) {
			buf[i] = img[clustno * 512 + i];
		}

		size -= 512;
		buf += 512;
		clustno = fat[clustno]; //得到下一个簇号
	}
}

struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max) {
	int i, j;
	char s[12];

	for (j = 0; j < 11; j++) { // 文件名是8字节，后缀是3字节
		s[j] = ' ';
	}
	j = 0;
	for (i = 0; name[i] != 0; ++i) {
		if (j >= 11) {
			return 0; //没有找到
		}
		if (name[i] == '.' && j <= 8) { // 后缀名  文件名称是8字节
			j = 8; // 如找到文件是'make.bat',s中存储的情况为'make    bat'
		} else {
			s[j] = name[i];
			if ('a' <= s[j] && s[j] <= 'z') {
				s[j] -= 0x20; //小写转大写
			}
			j++;
		}
	}
	// 找文件,i是索引
	for (i = 0; i < max;) {
		if (finfo->name[0] == 0x00) {
			break;
		}
		if ((finfo[i].type & 0x18) == 0) {
			for (j = 0; j < 11; j++) {
				if (finfo[i].name[j] != s[j]) {
					goto type_next_file;
				}
			}
			return finfo + i; // 找到文件
		}
		type_next_file: i++;
	}
	return 0;
}
